package com.cl.unipay4j.wx;

import com.cl.unipay4j.core.IBillDownload;
import com.cl.unipay4j.core.IPayConfig;
import com.cl.unipay4j.core.Result;
import com.cl.unipay4j.core.UnipayConst;
import com.cl.unipay4j.core.util.DateUtil;
import lombok.extern.slf4j.Slf4j;

import java.util.HashMap;
import java.util.Map;

/**
 * 微信对账单下载
 *
 * <p>下载交易账单</p>
 *
 * 商户可以通过该接口下载历史交易清单。比如掉单、系统错误等导致商户侧和微信侧数据不一致，通过对账单核对后可校正支付状态。
 *
 * 注意：
 *
 * 1、微信侧未成功下单的交易不会出现在对账单中。支付成功后撤销的交易会出现在对账单中，跟原支付单订单号一致；
 *
 * 2、微信在次日9点启动生成前一天的对账单，建议商户10点后再获取；
 *
 * 3、对账单中涉及金额的字段单位为“元”。
 *
 * 4、对账单接口只能下载三个月以内的账单。
 *
 * 5、对账单是以商户号纬度来生成的，如一个商户号与多个appid有绑定关系，则使用其中任何一个appid都可以请求下载对账单。对账单中的appid取自交易时候提交的appid，与请求下载对账单时使用的appid无关。
 *
 * 6、自2018年起入驻的商户默认是开通免充值券后的结算对账单。
 *
 * <p>下载资金账单</p>
 *
 * 商户可以通过该接口下载自2017年6月1日起 的历史资金流水账单。
 *
 * 说明：
 *
 * 1、资金账单中的数据反映的是商户微信账户资金变动情况；
 *
 * 2、当日账单在次日上午9点开始生成，建议商户在上午10点以后获取；
 *
 * 3、资金账单中涉及金额的字段单位为“元”。
 * @Author Small
 * @Date 2020/7/28 14:27
 * @Version 1.0
 **/
@Slf4j
public class WxPayBillDownload extends AbstractWxPay implements IBillDownload {
    public WxPayBillDownload() {
    }

    public WxPayBillDownload(IPayConfig payConfig) {
        super(payConfig);
    }

    /**
     * 下载对账单
     *  @param billDate  账单日期 格式 yyyy-MM-dd
     */
    @Override
    public Result execDown(String billDate) {
        log.info("WxBillDownload::=>请求到达，账单日期{},账单类型{}", billDate);
        if (!DateUtil.isLegalBillDate(billDate)) {
            return Result.returnFail(UnipayConst.INVALID_BILL_DATE, "账单日期不合法，正确格式为 yyyy-MM-dd");
        }
        try {
            Map<String, String> map = new HashMap<>();
            map.put("bill_date", billDate.replace("-", ""));
            map.put("bill_type", "ALL");
            Map<String, String> r = initWxPay().downloadBill(map);
            String returnCode = r.get("return_code");
            if (UnipayConst.SUCCESS.equals(returnCode)) {
                // 对账单内容
                Result.tradeSuccess(r.get("data"));
            } else {
                String returnMsg = r.get("return_msg");
                log.info("WxBillDownload::=>请求失败，账单日期{} ,错误代码{},错误原因{}", billDate, returnCode, returnMsg);
                return Result.returnFail(returnCode, returnMsg);
            }

        } catch (Exception e) {
            log.info("WxBillDownload::=>下载对账单发生异常，账单日期{}", billDate);
        }
        return Result.exception();
    }
}
